package com.wxzz.elearing.user.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.wxzz.elearing.user.amqp.producer.UserMessageProducer;
import com.wxzz.elearing.user.dto.SystemMessageDto;
import com.wxzz.elearing.user.dto.SystemMessageSelDto;
import com.wxzz.elearing.user.entity.*;
import com.wxzz.elearing.user.mapper.*;
import com.wxzz.elearing.user.service.ISystemMessageService;
import com.wxzz.elearing.user.service.IWxUserService;
import com.wxzz.elearning.common.aop.Idempotent;
import com.wxzz.elearning.common.bean.SmsConfig;
import com.wxzz.elearning.common.dto.FeignWxUserDto;
import com.wxzz.elearning.common.dto.SystemMessageMqDto;
import com.wxzz.elearning.common.exception.ServiceException;
import com.wxzz.elearning.common.utils.ListUtils;
import com.wxzz.elearning.common.vo.JgPageVo;
import com.wxzz.elearning.common.vo.ReturnVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 通知 服务实现类
 * </p>
 *
 * @author
 * @since 2021-05-22
 */
@Service
public class SystemMessageServiceImpl extends ServiceImpl<SystemMessageMapper, SystemMessage> implements ISystemMessageService {

    @Autowired
    private SystemMessageMapper systemMessageMapper;

    @Autowired
    private WxUserSystemMessageMapper wxUserSystemMessageMapper;

    @Autowired
    private WxUserMapper wxUserMapper;

    @Override
    public void sendSms(SystemMessage systemMessage) {
        //发送短信
        if (systemMessage.getType() == 0 && systemMessage.getIsMms() != null && systemMessage.getIsMms() == 1) {
            SystemMessageMqDto systemMessageMqDto = new SystemMessageMqDto();
            List<String> phones = new ArrayList<>();
            //如果是用户
            if (systemMessage.getMessageType() == 0) {
                //全部
                List<WxUser> wxUsers = wxUserMapper.selectList(new LambdaQueryWrapper<WxUser>());
                for (WxUser wxUser : wxUsers) {
                    phones.add(wxUser.getPhone());
                }
            }
            //如果是企业
            if (systemMessage.getMessageType() == 1) {
                List<Enterprise> enterprises = enterpriseMapper.selectList(new LambdaQueryWrapper<Enterprise>());
                for (Enterprise enterprise : enterprises) {
                    phones.add(enterprise.getLegalPersonPhone());
                }
            }
            systemMessageMqDto.setPhones(phones);
            systemMessageMqDto.setTemplateId(SmsConfig.messageId);
            systemMessageMqDto.setParams(new ArrayList<String>() {
                {
                    add(systemMessage.getMessageTitle());
                }
            });
            userMessageProducer.ackMQSender(JSONObject.toJSONString(systemMessageMqDto));
        }
    }

    @Autowired
    private UserMessageProducer userMessageProducer;

    @Override
    public ReturnVO saveSystemMessage(Long enterpriseId, SystemMessage systemMessage) {
        if (systemMessage.getMessageUrlsList() != null) {
            systemMessage.setMessageUrls(ListUtils.listToString(systemMessage.getMessageUrlsList()));
        }
        if (systemMessage.getId() == null) {
            systemMessage.setEnterpriseId(enterpriseId);
            systemMessageMapper.insert(systemMessage);
            //发送短信
            if (systemMessage.getMessageSendTime() != null) {
                userMessageProducer.sendSms(systemMessage.getId(), systemMessage, systemMessage.getMessageSendTime());
            }
        } else {
            wxUserSystemMessageMapper.delete(new LambdaQueryWrapper<WxUserSystemMessage>()
                    .eq(WxUserSystemMessage::getSystemMessageId, systemMessage.getId()));
            systemMessage.setEnterpriseId(enterpriseId);
            systemMessageMapper.updateById(systemMessage);
        }
        //todo 优化 发送到rabbitmq 进行流量削峰
        if (systemMessage.getCommonIds() != null) {
            for (Long commonId : systemMessage.getCommonIds()) {
                WxUserSystemMessage wxUserSystemMessage = new WxUserSystemMessage();
                wxUserSystemMessage.setCommonId(commonId);
                wxUserSystemMessage.setMessageType(systemMessage.getMessageType());
                wxUserSystemMessage.setSystemMessageId(systemMessage.getId());
                //查询该用户是否收到过
                WxUserSystemMessage isExit = wxUserSystemMessageMapper.selectOne(new LambdaQueryWrapper<WxUserSystemMessage>()
                        .eq(WxUserSystemMessage::getCommonId, commonId)
                        .eq(WxUserSystemMessage::getMessageType, systemMessage.getMessageType())
                        .eq(WxUserSystemMessage::getSystemMessageId, systemMessage.getId()));
                if (isExit == null) {
                    wxUserSystemMessageMapper.insert(wxUserSystemMessage);
                }
            }
        } else {
            //全部
            if (systemMessage.getMessageType() == 0) {
                List<WxUser> wxUsers = wxUserMapper.selectList(new LambdaQueryWrapper<WxUser>().select(WxUser::getId));
                wxUsers.stream().forEach(wxUser -> {
                    WxUserSystemMessage wxUserSystemMessage = new WxUserSystemMessage();
                    wxUserSystemMessage.setCommonId(wxUser.getId());
                    wxUserSystemMessage.setMessageType(systemMessage.getMessageType());
                    wxUserSystemMessage.setSystemMessageId(systemMessage.getId());
                    wxUserSystemMessageMapper.insert(wxUserSystemMessage);
                });
            }
            if (systemMessage.getMessageType() == 1) {
                List<Enterprise> enterprises = enterpriseMapper.selectList(new LambdaQueryWrapper<Enterprise>().select(Enterprise::getId));
                for (Enterprise enterprise : enterprises) {
                    WxUserSystemMessage wxUserSystemMessage = new WxUserSystemMessage();
                    wxUserSystemMessage.setCommonId(enterprise.getId());
                    wxUserSystemMessage.setMessageType(systemMessage.getMessageType());
                    wxUserSystemMessage.setSystemMessageId(systemMessage.getId());
                    wxUserSystemMessageMapper.insert(wxUserSystemMessage);
                }
            }

        }
        return new ReturnVO("消息通知添加成功", systemMessage.getId());
    }

    @Override
    public ReturnVO<SystemMessage> selectSystemMessageById(Long enterpriseId, Long systemMessageId) {
        SystemMessage systemMessage = systemMessageMapper.selectById(systemMessageId);
        systemMessage.setMessageUrlsList(ListUtils.stringToList(systemMessage.getMessageUrls()));
        Optional.ofNullable(systemMessage).orElseThrow(() -> new ServiceException("该消息已经不存在"));
        systemMessage.setMessageUrlsList(ListUtils.stringToList(systemMessage.getMessageUrls()));
        WxUserSystemMessage wxUserSystemMessage = wxUserSystemMessageMapper.selectOne(new LambdaQueryWrapper<WxUserSystemMessage>()
                .eq(WxUserSystemMessage::getCommonId, enterpriseId)
                .eq(WxUserSystemMessage::getSystemMessageId, systemMessageId)
                .eq(WxUserSystemMessage::getMessageType, systemMessage.getMessageType()));
        if (wxUserSystemMessage != null) {
            wxUserSystemMessage.setIsRead(1);
            wxUserSystemMessageMapper.updateById(wxUserSystemMessage);
        }
        CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
        if (commonCategory != null) {
            systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
        }
        return new ReturnVO("消息通知详情查询成功", systemMessage);
    }

    @Autowired
    private CommonCategoryMapper commonCategoryMapper;

    @Override
    public ReturnVO<JgPageVo<List<SystemMessage>>> wxListSystemMessage(Long commonId, SystemMessageDto systemMessageDto) {
        PageHelper.startPage(systemMessageDto.getCurPage(), systemMessageDto.getMaxPage());
        List<SystemMessage> systemMessages = systemMessageMapper.wxListSystemMessage(commonId, 0, systemMessageDto);
        for (SystemMessage systemMessage : systemMessages) {
            CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
            if (commonCategory != null) {
                systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
            }
        }
        return new ReturnVO("消息通知查询成功", new JgPageVo<>(new PageInfo(systemMessages)));
    }

    @Override
    public ReturnVO<JgPageVo<List<SystemMessage>>> listSystemMessage(Long commonId, SystemMessageDto systemMessageDto) {
        PageHelper.startPage(systemMessageDto.getCurPage(), systemMessageDto.getMaxPage());
        List<SystemMessage> systemMessages = systemMessageMapper.wxListSystemMessage(commonId, 1, systemMessageDto);
        for (SystemMessage systemMessage : systemMessages) {
            CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
            if (commonCategory != null) {
                systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
            }
        }
        return new ReturnVO("消息通知查询成功", new JgPageVo<>(new PageInfo(systemMessages)));
    }

    @Override
    public ReturnVO<JgPageVo<List<SystemMessage>>> listSystemMessage4platform(Long commonId, SystemMessageDto systemMessageDto) {
        PageHelper.startPage(systemMessageDto.getCurPage(), systemMessageDto.getMaxPage());
        List<SystemMessage> systemMessages = systemMessageMapper.wxListSystemMessage(commonId, 2, systemMessageDto);
        for (SystemMessage systemMessage : systemMessages) {
            CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
            if (commonCategory != null) {
                systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
            }
        }
        return new ReturnVO("消息通知查询成功", new JgPageVo<>(new PageInfo(systemMessages)));
    }

    @Override
    public ReturnVO<SystemMessage> wxSelectSystemMessageById(Long wxUserId, Long systemMessageId) {
        SystemMessage systemMessage = systemMessageMapper.selectById(systemMessageId);
        Optional.ofNullable(systemMessage).orElseThrow(() -> new ServiceException("该消息已经不存在"));
        systemMessage.setMessageUrlsList(ListUtils.stringToList(systemMessage.getMessageUrls()));
        WxUserSystemMessage wxUserSystemMessage = wxUserSystemMessageMapper.selectOne(new LambdaQueryWrapper<WxUserSystemMessage>()
                .eq(WxUserSystemMessage::getCommonId, wxUserId)
                .eq(WxUserSystemMessage::getSystemMessageId, systemMessageId)
                .eq(WxUserSystemMessage::getMessageType, systemMessage.getMessageType()));
        if (wxUserSystemMessage != null) {
            wxUserSystemMessage.setIsRead(1);
            wxUserSystemMessageMapper.updateById(wxUserSystemMessage);
        }
        CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
        if (commonCategory != null) {
            systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
        }
        return new ReturnVO("消息通知详情查询成功", systemMessage);
    }

    @Override
    public ReturnVO<JgPageVo<SystemMessage>> listSystemMessage(Long enterpriseId, SystemMessageSelDto systemMessageSelDto) {
        PageHelper.startPage(systemMessageSelDto.getCurPage(), systemMessageSelDto.getMaxPage());
        QueryWrapper<SystemMessage> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("create_time");
        queryWrapper.eq("enterprise_id", enterpriseId);
        if (systemMessageSelDto.getCommonCategoryId() != null) {
            queryWrapper.eq("common_category_id", systemMessageSelDto.getCommonCategoryId());
        }
        if (StringUtils.isNotBlank(systemMessageSelDto.getMessageTitle())) {
            queryWrapper.like("message_title", systemMessageSelDto.getMessageTitle() + "%");
        }
        if (systemMessageSelDto.getType() != null) {
            queryWrapper.eq("type", systemMessageSelDto.getType());
        }
        if (systemMessageSelDto.getStartTime() != null && systemMessageSelDto.getEndTime() != null) {
            queryWrapper.between("message_send_time", systemMessageSelDto.getStartTime(), systemMessageSelDto.getEndTime());
        }
        List<SystemMessage> systemMessages = systemMessageMapper.selectList(queryWrapper);
        for (SystemMessage systemMessage : systemMessages) {
            CommonCategory commonCategory = commonCategoryMapper.selectById(systemMessage.getCommonCategoryId());
            if (commonCategory != null) {
                systemMessage.setCommonCategoryName(commonCategory.getCategoryName());
            }
        }
        return new ReturnVO("消息通知详情查询成功", new JgPageVo<>(new PageInfo(systemMessages)));
    }

    @Autowired
    private IWxUserService wxUserService;

    @Autowired
    private EnterpriseMapper enterpriseMapper;

    @Override
    public ReturnVO<List<WxUser>> selectSystemMessageByWxUserId(Long systemMessageId) {
        SystemMessage systemMessage = systemMessageMapper.selectById(systemMessageId);
        Optional.ofNullable(systemMessage).orElseThrow(() -> new ServiceException("该消息已经不存在"));
        List<WxUserSystemMessage> wxUserSystemMessages = wxUserSystemMessageMapper.selectList(new LambdaQueryWrapper<WxUserSystemMessage>()
                .eq(WxUserSystemMessage::getSystemMessageId, systemMessageId)
                .eq(WxUserSystemMessage::getMessageType, 0));
        //设置用户信息
        for (WxUserSystemMessage wxUserSystemMessage : wxUserSystemMessages) {
            FeignWxUserDto feignWxUserDto = wxUserService.selectFeignWxUserDtoByWxUserId(wxUserSystemMessage.getCommonId());
            wxUserSystemMessage.setNickname(feignWxUserDto.getNickname());
            wxUserSystemMessage.setIcon(feignWxUserDto.getIcon());
            wxUserSystemMessage.setPhone(feignWxUserDto.getPhone());
            wxUserSystemMessage.setLastOrganizationName(feignWxUserDto.getLastOrganizationName());
            wxUserSystemMessage.setOrganizationName(feignWxUserDto.getOrganizationName());
            wxUserSystemMessage.setIdentityName(feignWxUserDto.getIdentityName());
        }
        return new ReturnVO("查询发送通知绑定的用户", wxUserSystemMessages);
    }

    @Override
    public ReturnVO<List<Enterprise>> selectSystemMessageByEnterpriseId(Long systemMessageId) {
        SystemMessage systemMessage = systemMessageMapper.selectById(systemMessageId);
        Optional.ofNullable(systemMessage).orElseThrow(() -> new ServiceException("该消息已经不存在"));
        List<WxUserSystemMessage> wxUserSystemMessages = wxUserSystemMessageMapper.selectList(new LambdaQueryWrapper<WxUserSystemMessage>()
                .eq(WxUserSystemMessage::getSystemMessageId, systemMessageId)
                .eq(WxUserSystemMessage::getMessageType, 1));
        List<Enterprise> enterpriseList = Lists.newArrayList();
        //设置企业信息
        for (WxUserSystemMessage wxUserSystemMessage : wxUserSystemMessages) {
            Enterprise enterprise = enterpriseMapper.selectById(wxUserSystemMessage.getCommonId());
            enterpriseList.add(enterprise);
        }
        return new ReturnVO("查询发送通知绑定的用户", enterpriseList);
    }

    @Override
    public ReturnVO allRead(Long enterpriseId) {
        if (enterpriseId == 0) {
            List<WxUserSystemMessage> wxUserSystemMessages = wxUserSystemMessageMapper.selectList(new LambdaQueryWrapper<WxUserSystemMessage>()
                    .eq(WxUserSystemMessage::getMessageType, 2));
            for (WxUserSystemMessage wxUserSystemMessage : wxUserSystemMessages) {
                wxUserSystemMessage.setIsRead(1);
                wxUserSystemMessageMapper.updateById(wxUserSystemMessage);
            }
        } else {
            List<WxUserSystemMessage> wxUserSystemMessages = wxUserSystemMessageMapper.selectList(new LambdaQueryWrapper<WxUserSystemMessage>()
                    .eq(WxUserSystemMessage::getMessageType, 1)
                    .eq(WxUserSystemMessage::getCommonId, enterpriseId));
            for (WxUserSystemMessage wxUserSystemMessage : wxUserSystemMessages) {
                wxUserSystemMessage.setIsRead(1);
                wxUserSystemMessageMapper.updateById(wxUserSystemMessage);
            }
        }
        return new ReturnVO("一键已读成功", null);
    }

    @Override
    public ReturnVO wxAllRead(Long wxUserId) {
        List<WxUserSystemMessage> wxUserSystemMessages = wxUserSystemMessageMapper.selectList(new LambdaQueryWrapper<WxUserSystemMessage>()
                .eq(WxUserSystemMessage::getMessageType, 0)
                .eq(WxUserSystemMessage::getCommonId, wxUserId));
        for (WxUserSystemMessage wxUserSystemMessage : wxUserSystemMessages) {
            wxUserSystemMessage.setIsRead(1);
            wxUserSystemMessageMapper.updateById(wxUserSystemMessage);
        }
        return new ReturnVO("一键已读成功", null);
    }

}
